package com.zts.modules.sys.service;

import com.zts.base.data.CrudService;
import com.zts.modules.sys.entity.Group;
import com.zts.modules.sys.entity.Role;
import com.zts.modules.sys.entity.User;

import java.util.List;

/**
 * Created by lily on 2017/6/7.
 */
public interface GroupService extends CrudService<Group> {

    /**
     * 获取下级组
     *
     * @param id
     * @param ifDirect true:获取直接下级组，false：获取包括简介下级组在内的所有下级组
     * @return
     */
    List<Group> getChildren(Long id, String ifDirect);

    /**
     * 获取组下的用户
     *
     * @param groupId
     * @param ifDirect true:获取当前组的直接用户，false：获取包括简介下级组在内的所有下级组的所有用户
     * @return
     */
    List<User> getUsers(Long groupId, String ifDirect);

    /**
     * 将某个用户加入某个组中
     *
     * @param userId
     * @param groupId
     * @param groupType
     * @param sortNum
     * @return
     */
    int addUserIntoGroup(Long userId, Long groupId, String groupType,int sortNum);

    /**
     * 批量将多个用户加入某个组中
     *
     * @param userIds
     * @param groupId
     * @param groupType
     * @return
     */
    int addUsersIntoGroup(List<Long> userIds, Long groupId, String groupType);

    /**
     * 将某个用户从某个组中删除
     *
     * @param userId
     * @param groupId
     * @return
     */
    int deleteUserFromGroup(Long userId, Long groupId);

    /**
     * 批量将多个用户从某个组中删除
     *
     * @param userIds
     * @param groupId
     * @return
     */
    int deleteUsersFromGroup(List<Long> userIds, Long groupId);

    /**
     * 组是否存在
     *
     * @param id
     * @return
     */
    boolean checkExist(Long id);

    /**
     * 状态是否有效
     *
     * @param id
     * @return
     */
    boolean checkStatus(Long id);

    /**
     * 用户是否在组中
     *
     * @param userId
     * @param groupId
     * @param ifDirect 空或true：只校验直接关系  false：校验用户是否是该组的递归下级组
     * @return
     */
    boolean checkUserGroupExist(Long userId, Long groupId, String ifDirect);

    /**
     * 给组授权，组下某些用户除外
     *
     * @param groupId
     * @param roleId
     * @param userIds
     * @return
     */
    int groupGrantExcludeUsers(Long groupId, Long roleId, List<Long> userIds);

    /**
     * 组批量授权
     *
     * @param groupId
     * @param roleIds
     * @param grantType
     * @return
     */
    int batchGrant(Long groupId, List<Long> roleIds, String grantType);

    /**
     * 组删除单一角色
     *
     * @param groupId
     * @param roleId
     * @param grantType
     * @return
     */
    int singleGrantDelete(Long groupId, Long roleId, String grantType);

    /**
     * 组批量删除多个角色
     *
     * @param groupId
     * @param roleIds
     * @param grantType
     * @return
     */
    int batchGrantDelete(Long groupId, List<Long> roleIds, String grantType);

    /**
     * 查看组直接拥有的角色
     *
     * @param groupId
     * @return
     */
    List<Role> getRoles(Long groupId);

    /**
     * 查看组拥有的所有角色，包括组（group)的递归上级组拥有的角色
     *
     * @param groupId
     * @return
     */
    List<Role> getAllRoles(Long groupId);


}
